package com.nd.rj.common.thirdPlatformAuth.activity;

import java.lang.reflect.Field;

import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.WindowManager;
import android.widget.Toast;

import com.common.StarAppConfig;
import com.common.android.utils.ToastUtils;
import com.flurry.android.FlurryAgent;
import com.nd.rj.common.R;
import com.product.android.ui.activity.BaseReceiverFragmentActivity;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuth;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.auth.sso.SsoHandler;
import com.sina.weibo.sdk.exception.WeiboException;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;

/**
 * 第三方授权基类
 * 
 * <br>Created 2014-11-6 上午11:32:42
 * @version  
 * @author   linsj		
 *
 * @see 	 
 * 
 * Copyright(c) 2009-2014, TQ Digital Entertainment, All Rights Reserved
 *
 */
public class LoginAuthActivityBase extends BaseReceiverFragmentActivity {

    /** 微博 Web 授权类，提供登陆等功能  */
    private WeiboAuth mWeiboAuth;
    
    /** 封装了 "access_token"，"expires_in"，"refresh_token"，并提供了他们的管理功能  */
    private Oauth2AccessToken mAccessToken;

    /** 注意：SsoHandler 仅当 SDK 支持 SSO 时有效 */
    private SsoHandler mSsoHandler;
    
    public Tencent mTencent;

    /**
     * @see {@link Activity#onCreate}
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    
    /**
     * 处理新浪微博的登录授权
     * 
     * <br>Created 2014-11-6 上午11:55:26
     * @author       linsj
     */
    protected void doSinaWeiboAuth(String strAppKey, String strRedirectUrl, String strScope){
        mSsoHandler = new SsoHandler(this, getSinaWeiboAuth(strAppKey, strRedirectUrl, strScope));
        mSsoHandler.authorize(new AuthListener());
    }

    /**
     * 当 SSO 授权 Activity 退出时，该函数被调用。
     * 
     * @see {@link Activity#onActivityResult}
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        
        // SSO 授权回调
        // 重要：发起 SSO 登陆的 Activity 必须重写 onActivityResult
        if (mSsoHandler != null) {
            mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
        }
    }

    /**
     * 微博认证授权回调类。
     * 1. SSO 授权时，需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} 后，
     *    该回调才会被执行。
     * 2. 非 SSO 授权时，当授权结束后，该回调就会被执行。
     * 当授权成功后，请保存该 access_token、expires_in、uid 等信息到 SharedPreferences 中。
     */
    class AuthListener implements WeiboAuthListener {
        
        @Override
        public void onComplete(Bundle values) {
            // 从 Bundle 中解析 Token
            mAccessToken = Oauth2AccessToken.parseAccessToken(values);
            if (mAccessToken.isSessionValid()) {
            } else {
                // 以下几种情况，您会收到 Code：
                // 1. 当您未在平台上注册的应用程序的包名与签名时；
                // 2. 当您注册的应用程序包名与签名不正确时；
                // 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
                String strMessage = getString(R.string.sina_weibo_auth_failed);
                // String code = values.getString("code");
                // if (!TextUtils.isEmpty(code)) {
                // message = message + "\n授权错误码：" + code;
                // }
                Toast.makeText(LoginAuthActivityBase.this, strMessage, Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onCancel() {
        }

        @Override
        public void onWeiboException(WeiboException e) {
            // 只要activity不是null，都应该显示消息，即使已经finish
            StringBuilder sb = new StringBuilder();
            sb.append(getString(R.string.sina_weibo_auth_exception)).append("：")
                    .append(e.getMessage());
            Toast.makeText(LoginAuthActivityBase.this, sb.toString(), Toast.LENGTH_LONG).show();
        }
    }
    
    /**
     * 处理QQ登录授权
     * 
     * <br>Created 2014-11-6 上午11:55:26
     * @author       linsj
     */
    protected void doQQAuth(String strAppID){
        getTecentAuth(strAppID).login(this, "all", mQQLoginAuthListener);
    }
    
    IUiListener mQQLoginAuthListener = new IUiListener() {

        @Override
        public void onComplete(Object response) {
            if (null == response) {
                ToastUtils.display(LoginAuthActivityBase.this, "返回为空");
                return;
            }
            JSONObject jsonResponse = (JSONObject) response;
            if (null != jsonResponse && jsonResponse.length() == 0) {
                ToastUtils.display(LoginAuthActivityBase.this, "返回为空");
                return;
            }
            ToastUtils.display(LoginAuthActivityBase.this, response.toString());
            doComplete((JSONObject)response);
        }

        protected void doComplete(JSONObject values) {

        }

        @Override
        public void onError(UiError e) {
            ToastUtils.display(LoginAuthActivityBase.this, e.errorDetail);
        }

        @Override
        public void onCancel() {
        }
    };

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    @Override
    protected void onStart() {
        super.onStart();
        FlurryAgent.onStartSession(this, StarAppConfig.CONFIG_FLURRY_APPLICATION_KEY);
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        FlurryAgent.onEndSession(this);
    }

    /**
     * 开启硬件加速
     * 
     * <br>
     * Created 2014-6-13 上午10:59:01
     * 
     * @param act
     *            activity对象
     * @author : HuangYK
     */
    public static void openGpu(Activity act) {
        if (Build.VERSION.SDK_INT < VERSION_CODES.ICE_CREAM_SANDWICH) {
            return;
        }

        if (act == null || act.getWindow() == null
                || act.getWindow().getAttributes() == null) {
            return;
        }

        try {
            WindowManager.LayoutParams lp = act.getWindow().getAttributes();
            Field field = lp.getClass().getField("FLAG_HARDWARE_ACCELERATED");
            int flag_hardware_accelerated = field.getInt(lp);
            act.getWindow().addFlags(flag_hardware_accelerated);
        } catch (Exception ex) {
            Log.e("openGpu Exception", ex.toString());
            return;
        }
    }
    
    /**
     * 获得新浪微博对象
     * 
     * <br>Created 2014-11-6 下午7:32:41
     * @param strAppKey         APP_KEY
     * @param strRedirectUrl    回调地址
     * @param strScope          权限范围
     * @return                  微博对象
     * @author       linsj
     */
    private WeiboAuth getSinaWeiboAuth(String strAppKey, String strRedirectUrl, String strScope) {
        if (null == mWeiboAuth) {
            // 初始化微博对象
            mWeiboAuth = new WeiboAuth(this, strAppKey, strRedirectUrl, strScope);
        }

        return mWeiboAuth;
    }
    
    /**
     * 获得腾讯授权实例
     * 
     * <br>Created 2014-11-6 下午7:32:41
     * @param strAppKey         APP_ID
     * @return                  腾讯授权实例
     * @author       linsj
     */
    private Tencent getTecentAuth(String strAppID) {
        if (null == mTencent) {
            // 初始化微博对象
            mTencent = Tencent.createInstance(strAppID, this);
        }

        return mTencent;
    }
}